package dao;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import conexao.HibernateUtil;

import model.Contato;

public class ContatoDao implements CrudDao {

	@Override
	public void salvar(Contato contato) {
		Session session = null;
		Transaction transacao = null;
		try {
			session = HibernateUtil.getSessionFactory().openSession();
			transacao = session.beginTransaction();
			session.save(contato);
			transacao.commit();
		} catch (HibernateException e) {
			System.out.println("Nao foi possivel salvar contato "+e.getMessage());
		}finally{
			try {
				session.close();
			} catch (Throwable e) {
				System.out.println("Nao foi possivel fecha a sessao Salvar "+e.getMessage());
			}
		}
	}

	@Override
	public void atualizar(Contato contato) {
		Session session = null;
		Transaction transacao = null;
		try {
			session = HibernateUtil.getSessionFactory().openSession();
			transacao = session.beginTransaction();
			session.update(contato);
			transacao.commit();
		} catch (HibernateException e) {
			System.out.println("Nao foi possivel atualizar contato "+e.getMessage());
		}finally{
			try {
				session.close();
			} catch (Throwable e) {
				System.out.println("Nao foi possivel fecha a sessao atualizar "+e.getMessage());
			}
		}
	}

	@Override
	public void excluir(Contato contato) {
		Session session = null;
		Transaction transacao = null;
		try {
			session = HibernateUtil.getSessionFactory().openSession();
			transacao = session.beginTransaction();
			session.delete(contato);
			transacao.commit();
		} catch (HibernateException e) {
			System.out.println("Nao foi possivel deletar contato "+e.getMessage());
		}finally{
			try {
				session.close();
			} catch (Throwable e) {
				System.out.println("Nao foi prossivel fecha a sessao deletar "+e.getMessage());
			}
		}
		
	}

	@Override
	public List<Contato> listar() {
		Session session = null;
		Transaction transacao = null;
		Query consulta = null;
		List<Contato> resultado = null;
		try {
			session = HibernateUtil.getSessionFactory().openSession();
			transacao = session.beginTransaction();
			consulta = session.createQuery("FROM CONTATO");
			resultado = consulta.list();
			transacao.commit();
		} catch (HibernateException e) {
			System.out.println("Nao foi possivel listar contatos "+e.getMessage());
		}finally{
			try {
				session.close();
			} catch (Throwable e) {
				System.out.println("Nao foi prossivel fecha a sessao listar "+e.getMessage());
			}
		}
	    return resultado;
	}

	@Override
	public Contato listaContato(int id) {
		Session session = null;
		Transaction transacao = null;
		Query consulta = null;
		Contato contato = null;
		try {
			session = HibernateUtil.getSessionFactory().openSession();
			transacao = session.beginTransaction();
			consulta = session.createQuery("FROM CONTATO WHERE CODIGO = :parametro");
			consulta.setInteger("parametro", id);
			contato = (Contato)consulta.uniqueResult();
			transacao.commit();
		} catch (HibernateException e) {
			System.out.println("Nao foi possivel achar contato "+e.getMessage());
		}finally{
			try {
				session.close();
			} catch (Throwable e) {
				System.out.println("Nao foi prossivel fecha a sessao listaContato "+e.getMessage());
			}
		}
	    return contato;
	}

}
